/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Secretaria;
import br.com.foxinline.modelo.Setor;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.GrupoServico;
import br.com.foxinline.servico.SecretariaServico;
import br.com.foxinline.servico.SetorServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.EmailUtilitario;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DualListModel;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarUsuario {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    SetorServico setorServico;
    @EJB
    GrupoServico grupoServico;
    @EJB
    SecretariaServico secretariaServico;
    private List<Grupo> grupos;
    private List<Grupo> gruposVisualizar;
    private List<Grupo> grupoSelecionado;
    private Usuario usuario;
    private Usuario usuarioVisualizar;
    private Usuario usuarioEditar;
    private Usuario usuarioLogin;
    private Usuario usuarioExcluir;
    private List<Usuario> usuarios;
    private Setor setor;
    private List<Setor> setores;
    private Setor setorPesquisar;
    private Setor setorVisualizar;
    private String usuEd;
    private String usuVi;
    private String usuLo;
    private String senhaAntiga;
    private String senha;
    private String novaSenha;
    private Secretaria secretariaPesquisar;
    private Boolean panel;
    private DualListModel<Grupo> dualGrupo;
    private List<Grupo> gruposSelec;

    @PostConstruct
    public void init() {
        usuario = new Usuario();
        usuarios = new ArrayList<Usuario>();
        setor = new Setor();
        setores = new ArrayList<Setor>();
        setorPesquisar = new Setor();

        secretariaPesquisar = new Secretaria();

        panel = Boolean.FALSE;
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        usuEd = params.get("usuEd");
        usuVi = params.get("usuVi");
        usuLo = params.get("usuLo");

        usuarios = usuarioServico.pesquisarTodos();

        paramPost();

    }

    public void pesquisar() {
        usuarios = usuarioServico.pesquisarUsuario(usuario);
    }

    public List<Secretaria> todasSecretarias() {
        return secretariaServico.pesquisarTodos();
    }

    public void ativarPesquisar() {
        panel = Boolean.TRUE;
    }

    public void atualizar() {
        try {
            if (usuarioServico.usuarioObrigatorio(usuarioEditar)) {
                
                usuarioEditar.setSetor(setor);
                usuarioEditar.setGrupos(dualGrupo.getTarget());
                usuarioServico.atualizar(usuarioEditar);

                usuarioEditar = usuarioServico.pesquisar(usuarioEditar.getId());

                Msg.messagemInfoRedirect(Msg.SuccessFull, "visualizarusuario.xhtml?usuVi=" + usuarioEditar.getId());
            } else {
                Msg.messagemWarn("O campo nome é obrigatório");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void atualizarLogin() {
        try {
            if (usuarioServico.verificaSenhaAntiga(senhaAntiga, usuarioLogin)) {
                if (usuarioServico.senhaObrigatorio(usuarioLogin)) {
                    usuarioLogin.setSenha(novaSenha);
                    if (usuarioServico.verificaSenha(senha, usuarioLogin)) {
                        usuarioLogin.setSenha(Usuario.encryptPassword(usuarioLogin.getSenha()));
                        usuarioServico.atualizar(usuarioLogin);
                        senhaAntiga = new String();
                        Msg.messagemInfo(Msg.SuccessFull);
                    } else {
                        Msg.messagemWarn("Senhas não conferem");
                    }
                } else {
                    Msg.messagemWarn("O campo senha é obrigatório");
                }

            } else {
                Msg.messagemWarn("Senha antiga incorreta");
            }
        } catch (Exception erro) {
            erro.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void atualizarLoginPrimeiroAcesso() {
        if (novaSenha.equals(senha)) {
            Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
            String token = params.get("create_password_token");

            if (token != null) {
                Usuario usuarioAtual = usuarioServico.getUsuarioAtualViaToken(token);
                usuarioAtual.setSenha(Usuario.encryptPassword(senha));
                usuarioServico.atualizar(usuarioAtual);
                Msg.messagemInfoRedirect(Msg.SuccessFull.concat("/n/n Acesso ao sistema Tabularium efetuado com sucesso !"), "/");
            }
        } else {
            Msg.messagemError("Senhas não conferem !\n Por favor tente novamente.");
        }
    }

    public void paramPost() {
        try {
            if (usuEd != null) {
                usuarioEditar = usuarioServico.pesquisar(Long.parseLong(usuEd));

                if (usuarioEditar == null) {
                    usuarioEditar = new Usuario();
                }
                if (usuarioEditar.getSetor() != null) {
                    secretariaPesquisar = usuarioEditar.getSetor().getSecretaria();
                    setor = usuarioEditar.getSetor();
                    setores = secretariaServico.findSetores(secretariaPesquisar);
                } else {
                    secretariaPesquisar = new Secretaria();
                    setor = new Setor();
                    setores = new ArrayList<Setor>();
                }

                if (usuarioEditar != null && usuarioEditar.getGrupos() != null && !usuarioEditar.getGrupos().isEmpty()) {
                    gruposSelec = grupoServico.findGrupos(usuarioEditar);
                } else {
                    gruposSelec = new ArrayList<Grupo>();
                }

                List<Grupo> gruposEditar;

                if (gruposSelec == null || gruposSelec.isEmpty()) {
                    gruposEditar = grupoServico.pesquisarTodos();
                } else {
                    gruposEditar = grupoServico.findGruposE(usuarioEditar);
                }

                dualGrupo = new DualListModel<Grupo>(gruposEditar, gruposSelec);
            }
            if (usuVi != null) {
                usuarioVisualizar = usuarioServico.pesquisar(Long.parseLong(usuVi));
                setorVisualizar = usuarioVisualizar.getSetor() != null ? usuarioVisualizar.getSetor() : new Setor();
                gruposVisualizar = grupoServico.findGrupos(usuarioVisualizar);
            }
            if (usuLo != null) {
                usuarioLogin = usuarioServico.pesquisar(Long.parseLong(usuLo));
            }
        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }

    public void setUsuariorr(Usuario usuario) {
        this.usuarioExcluir = usuario;
    }

    public void excluir() {
        try {
            usuarios.remove(usuarioExcluir);
            this.usuarioExcluir.setAtivo(Boolean.FALSE);
            usuarioServico.atualizar(usuarioExcluir);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception erro) {
        }
    }

    /**
     * Reenvia um e-mail, contendo o token, para o primeiro acesso ao usuário
     *
     * @param usuario usuário contendo o token e o email
     */
    public void reenviarSenha(Usuario usuario) {
        try {
            if (usuario != null && usuario.getId() != null) {
                if (usuario.getEmail() != null && !usuario.getEmail().isEmpty()) {
                    Msg.messagemError("O usuário não possui e-mail cadastrado  !");
                    return;
                }
                if (usuario != null && usuario.getId() != null && usuario.getToken() != null && !usuario.getToken().isEmpty()) {
                    EmailUtilitario email = new EmailUtilitario();

                    email.enviarEmail(usuario.getEmail(), EmailUtilitario.primeiroAcesso(usuario), usuarioServico.getCurrentUser().getNome());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemErrorWithDetail("Ocorreu um erro ao enviar o e-mail !", "Verifique se o endereço de e-mail é válido e tente novamente");
        }
    }

    public void todosSetoresSec() {
        setores = secretariaServico.findSetores(secretariaPesquisar);
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Usuario getUsuarioVisualizar() {
        return usuarioVisualizar;
    }

    public void setUsuarioVisualizar(Usuario usuarioVisualizar) {
        this.usuarioVisualizar = usuarioVisualizar;
    }

    public Usuario getUsuarioEditar() {
        return usuarioEditar;
    }

    public void setUsuarioEditar(Usuario usuarioEditar) {
        this.usuarioEditar = usuarioEditar;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public List<Setor> getSetores() {
        return setores;
    }

    public void setSetores(List<Setor> setores) {
        this.setores = setores;
    }

    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupos) {
        this.grupos = grupos;
    }

    public Setor getSetorPesquisar() {
        return setorPesquisar;
    }

    public void setSetorPesquisar(Setor setorPesquisar) {
        this.setorPesquisar = setorPesquisar;
    }

    public List<Grupo> getGrupoSelecionado() {
        return grupoSelecionado;
    }

    public void setGrupoSelecionado(List<Grupo> grupoSelecionado) {
        this.grupoSelecionado = grupoSelecionado;
    }

    public Setor getSetorVisualizar() {
        return setorVisualizar;
    }

    public void setSetorVisualizar(Setor setorVisualizar) {
        this.setorVisualizar = setorVisualizar;
    }

    public List<Grupo> getGruposVisualizar() {
        return gruposVisualizar;
    }

    public void setGruposVisualizar(List<Grupo> gruposVisualizar) {
        this.gruposVisualizar = gruposVisualizar;
    }

    public String getSenhaAntiga() {
        return senhaAntiga;
    }

    public void setSenhaAntiga(String senhaAntiga) {
        this.senhaAntiga = senhaAntiga;
    }

    public Usuario getUsuarioLogin() {
        return usuarioLogin;
    }

    public void setUsuarioLogin(Usuario usuarioLogin) {
        this.usuarioLogin = usuarioLogin;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNovaSenha() {
        return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
        this.novaSenha = novaSenha;
    }

    public Secretaria getSecretariaPesquisar() {
        return secretariaPesquisar;
    }

    public void setSecretariaPesquisar(Secretaria secretariaPesquisar) {
        this.secretariaPesquisar = secretariaPesquisar;
    }

    public Boolean getPanel() {
        return panel;
    }

    public void setPanel(Boolean panel) {
        this.panel = panel;
    }

    public DualListModel<Grupo> getDualGrupo() {
        return dualGrupo;
    }

    public void setDualGrupo(DualListModel<Grupo> dualGrupo) {
        this.dualGrupo = dualGrupo;
    }

    public List<Grupo> getGruposSelec() {
        return gruposSelec;
    }

    public void setGruposSelec(List<Grupo> gruposSelec) {
        this.gruposSelec = gruposSelec;
    }
}
